from django.db.models import Q
from drf_yasg import openapi
from drf_yasg.utils import swagger_auto_schema
from rest_framework import viewsets
from rest_framework.decorators import action

from BYD_ERP.utils.base_views import MultipleDestroyMixin, MultipleOpenMixin
from BYD_ERP.utils.pagination import GlobalPagination
from basic_info.models import MouldModel
from basic_info.serializer.mould_serializer import MouldSerializer


class MouldView(viewsets.ModelViewSet, MultipleDestroyMixin, MultipleOpenMixin):
    """
        create:
        模具信息--新增

        模具信息新增，status：201（成功），return：新增模具信息

        destroy:
        模具信息--删除

        模具信息删除，status：204（成功），return：None

        multiple_delete:
        模具信息--批量删除，必传参数：ids=[1,2,3,4……]

        模具信息批量删除，status：204（成功），return：None

        multiple_open:
        模具信息--批量启用或者禁用，必传（json）参数：ids=[1,2,3,4……]（列表中可以只有一个参数），is_open=1/0

        {
            "ids": [1,2],
            "is_open": "0"
        }
        is_open=1表示禁用，is_open=0表示启用
        模具信息批量启用或者禁用，status：204（成功），return：None

        update:
        模具信息--修改

        模具信息修改，status：200（成功），return：修改后的模具信息

        partial_update:
        模具信息--局部修改，可以传任意属性的值，服务器会修改指定的属性值

        模具信息局部修改，status：200（成功），return：修改后的模具信息

        find:
        模具的过滤查询

        模具信息列表信息，status：200（成功），return：模具信息列表

        list:
        模具信息--获取分页列表，可选json参数：name（名称），mobile（手机号），phone（联系电话）

        {
            "name": "青岛XXXXX有限公司",
            "mobile": "13811112222",
            "phone": "0532-123123"
        }
        模具信息列表信息，status：200（成功），return：模具信息列表

        retrieve:
        查询某一个模具信息

        查询指定ID的模具信息，status：200（成功），return：指定模具信息

    """
    queryset = MouldModel.objects.all()
    serializer_class = MouldSerializer
    pagination_class = GlobalPagination

    def get_queryset(self):
        if self.action == 'find':  # 可能需要过滤查询
            # 接收三个可能的参数，json格式，name，remark
            name = self.request.data.get('name', None)
            diameter = self.request.data.get('diameter', None)
            perimeter = self.request.data.get('perimeter', None)  # 模具周长
            remark = self.request.data.get('remark', None)
            # 因为参数可能没有，造成过滤条件是动态的
            query = Q()  # 先赋值一个空的查询条件，先初始化一下，就是没有条件
            if name:
                # 模糊查询，name like "%keyword关键字%"
                # contains在这里就是like的意思。
                query.add(Q(name__contains=name), 'AND')  # 多条件组合
            if diameter:
                query.add(Q(diameter__contains=diameter), 'AND')  # 多条件组合
            if perimeter:
                query.add(Q(perimeter__contains=perimeter), 'AND')  # 多条件组合
            if remark:
                query.add(Q(remark__contains=remark), 'AND')  # 多条件组合
            return MouldModel.objects.filter(query).all()
        else:
            return MouldModel.objects.all()

    json_params = openapi.Schema(type=openapi.TYPE_OBJECT, properties={
        'name': openapi.Schema(type=openapi.TYPE_STRING, description="模具名称的关键字"),
        'diameter': openapi.Schema(type=openapi.TYPE_STRING, description="模具直径的关键字"),
        'perimeter': openapi.Schema(type=openapi.TYPE_STRING, description="模具周长的关键字"),
        'remark': openapi.Schema(type=openapi.TYPE_STRING, description="模具描述的关键字"),
    })

    # drf框架中，分页的页号，和每页显示的数量只能通过请求路径的传参。
    page_param = openapi.Parameter(name='page', in_=openapi.IN_QUERY, description="页号",
                                   type=openapi.TYPE_STRING)  # 请求路径的传参
    size_param = openapi.Parameter(name='page_size_user_defined', in_=openapi.IN_QUERY, description="每页显示的数量",
                                   type=openapi.TYPE_STRING)  # 请求路径的传参

    @swagger_auto_schema(method='post', request_body=json_params, manual_parameters=[page_param, size_param],
                         operation_description="模具的过滤查询")
    # swagger_auto_schema中如果method='get'， 是不能用request_body=open_ids的
    # request_body就是定义json格式的传参
    @action(methods=['post'], detail=False)
    def find(self, request, *args, **kwargs):
        return super(MouldView, self).list(request=request, *args, **kwargs)
